#ifndef NMEAPARSER_H
#define NMEAPARSER_H

#include <QObject>
#include <QString>
#include <QStringList>
#include <QDateTime>

/**
 * @brief GPS数据结构体，用于存储解析后的GPS信息
 */
struct GpsData {
    double latitude = 0.0;      // 纬度
    double longitude = 0.0;     // 经度
    double altitude = 0.0;      // 海拔高度
    double speed = 0.0;         // 速度 (节)
    double course = 0.0;        // 航向角度
    int satellites = 0;         // 卫星数量
    QDateTime timestamp;        // 时间戳
    QString quality;            // 定位质量
    bool isValid = false;       // 数据是否有效
};

/**
 * @brief NMEA-0183协议解析器类
 * 
 * 该类负责解析从GPS设备接收到的NMEA-0183格式数据
 * 支持常见的NMEA语句如GGA、RMC、GSA、GSV等
 */
class NmeaParser : public QObject
{
    Q_OBJECT

public:
    explicit NmeaParser(QObject *parent = nullptr);

    /**
     * @brief 解析NMEA数据行
     * @param nmeaLine NMEA格式的数据行
     * @return 解析是否成功
     */
    bool parseNmeaLine(const QString &nmeaLine);

    /**
     * @brief 获取当前GPS数据
     * @return GPS数据结构体
     */
    GpsData getCurrentGpsData() const;

    /**
     * @brief 验证NMEA校验和
     * @param nmeaLine NMEA数据行
     * @return 校验和是否正确
     */
    static bool validateChecksum(const QString &nmeaLine);

signals:
    /**
     * @brief GPS数据更新信号
     * @param gpsData 更新后的GPS数据
     */
    void gpsDataUpdated(const GpsData &gpsData);

    /**
     * @brief 解析错误信号
     * @param error 错误信息
     */
    void parseError(const QString &error);

private:
    GpsData m_currentGpsData;   // 当前GPS数据

    /**
     * @brief 解析GGA语句 (Global Positioning System Fix Data)
     * @param fields 分割后的字段列表
     * @return 解析是否成功
     */
    bool parseGGA(const QStringList &fields);

    /**
     * @brief 解析RMC语句 (Recommended Minimum Course)
     * @param fields 分割后的字段列表
     * @return 解析是否成功
     */
    bool parseRMC(const QStringList &fields);

    /**
     * @brief 解析GSA语句 (GPS DOP and active satellites)
     * @param fields 分割后的字段列表
     * @return 解析是否成功
     */
    bool parseGSA(const QStringList &fields);

    /**
     * @brief 将度分格式转换为十进制度数
     * @param dmm 度分格式字符串 (DDMM.MMMM)
     * @return 十进制度数
     */
    double convertDMMToDecimal(const QString &dmm);

    /**
     * @brief 解析时间字符串
     * @param timeStr 时间字符串 (HHMMSS.SSS)
     * @param dateStr 日期字符串 (DDMMYY)
     * @return QDateTime对象
     */
    QDateTime parseDateTime(const QString &timeStr, const QString &dateStr = QString());
};

#endif // NMEAPARSER_H